from django.shortcuts import render

# Create your views here.
import sys
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job

from django.core.cache import cache
from libs.connect_ssh.devops_ssh import do_ssh
from libs.connect_influxdb.Ops_influxdb import sava_Opsdb
from charts.models import Host
from variable.models import System_variable
from libs.alarmspy.alarmtype1 import alarm_mysql, cron_job_mysql


# 实例化调度器
scheduler = BackgroundScheduler()
# 调度器使用默认的 DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), 'default')


def set_redis():
    '''
    更新缓存
    :return:
    '''
    host_all = Host.objects.filter(host_status=0, is_manage=0).values('host_ip', 'host_name')
    variable_all = System_variable.objects.filter(var_group=1).values('var_lable', 'var_name', 'var_value')
    cache.set('host_all', list(host_all))

    variable_dit = {i['var_name']: i for i in variable_all}
    cache.set('variable_all', variable_dit)
    return host_all, variable_dit


def format_list(lit, host):
    '''
    格式化 ssh 返回的数据
    :param lit:
    :return: {'time': '2023-03-17 17:01:27', 'cpu%': 0.0, 'memory%': 24.8, 'disk%': 12.3, 'recvMB': 15, 'sentMB': 7, 'ip': '172.20.60.145'}
    '''
    dit = eval(lit)
    dit.update(host)
    return dit


# @register_job(scheduler, 'cron', id='interval', seconds=30, args=['test'])
# 触发器：‘interval’表示间隔执行， ‘date’, 表示指定时间触发， ‘cron’表示固定时间间隔触发。
# weeks：每隔多少周后执行一次
# days：每隔多少天后执行一次
# hours：每隔多少小时后执行一次
# minutes：每隔多少分钟后执行一次
# seconds：每隔多少秒后执行一次
@register_job(scheduler, 'interval', seconds=30, id='sava_influxdb', replace_existing=True, max_instances=100)
def sava_influxdb():
    '''
    将服务器返回的数据信息存入 influxdb 中
    :return: 指点类型
    '''
    if not cache.get('host_all'):
        host_all, variable_dit = set_redis()
    else:
        host_all = cache.get('host_all')
        variable_dit = cache.get('variable_all')

    for host in host_all:
        ssh, sftp = do_ssh(host.get('host_ip'))
        stdin, stdout, stderr = ssh.exec_command('python3 /ysg/psut.py')
        # 获取 脚本执行结果，并实例化数据
        stdout_list = stdout.read().decode()
        ret_dit = format_list(stdout_list, host)
        # 与阀值比较，不同则录入报警信息到 MySQL 中
        alarm_mysql(ret_dit, variable_dit)
        # 入库到 influxdb【与比较结果无关】
        sava_Opsdb(ret_dit)
        ssh.close()  # 关闭连接


@register_job(scheduler, 'interval', id='get_host', hours=6, replace_existing=True, max_instances=100)
# @register_job(scheduler, 'interval', id='get_host', seconds=30, replace_existing=True, max_instances=100)
def get_host():
    set_redis()


# 通过 json 数据创建定时任务
# 传入 状态策略 开始任务 结束任务
def insert_cron_job(file_name, json):
    try:
        # 获取 json 中对应数据
        # add_job：添加任务
        # my_job：要执行的定时任务
        # trigger：指定任务触发器（triggers）—不同定时模式
        # args：cron_job 函数的传参
        # id：定时任务命名–id
        # 等其他配置，根据 trigger 不同，传入不同的 时间格式进行触发
        file_name_id = file_name + '_' + json['host_ip']
        scheduler.add_job(cron_job, trigger='interval', args=[file_name, json, ], seconds=int(json['py_timer']),
                          id=file_name_id, replace_existing=True, max_instances=100, misfire_grace_time=5)
        scheduler.resume_job(file_name_id, jobstore=None)
    except Exception as e:
        print(f"获取数据异常 {e}")
        return


# 具体要执行的代码
def cron_job(file_name, json):
    ssh, sftp = do_ssh(json['host_ip'])
    stdin, stdout, stderr = ssh.exec_command(f'python3 /ysg/monitorpy/{file_name}')
    # 获取 脚本执行结果，并实例化数据
    stdout_list = stdout.read().decode()
    # 与阀值比较，不同则录入报警信息到 MySQL 中
    if stdout_list:
        alarm_info = f"{json['host_ip']}: {stdout_list}"
        cron_job_mysql(json['py_title'], alarm_info)


# 注册定时任务并开始
# register_events(scheduler)
# scheduler.start()
# scheduler.print_jobs(jobstore=None, out=sys.stdout)
